package com.example.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.entity.vo.StudentVO;
import com.example.service.AccountService;
import com.example.service.StudentService;
import com.example.service.impl.StudentServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 数据库相关测试
 */
@RestController
@RequestMapping("db_test")
@RequiredArgsConstructor
public class DBTestController {

    private final StudentService studentService;

    private final AccountService accountService;

    @GetMapping("/invalid")
    public String testInvalidDS(@RequestParam String name) {
        studentService.testInvalidDS(name);
        return "success";
    }

    @GetMapping("/query")
    public Page<StudentVO> testSelect() {
        return studentService.getStudentList();
    }

    /**
     * 测试多数据源 @DS
     */
    @GetMapping("/testDS")
    public String testDS() {
        accountService.testDS();
        return "success";
    }


    /**
     * 测试 @DS + 批量插入
     */
    @GetMapping("/test_batch")
    public String testBatch() {
        boolean success = studentService.testBatch();
        return success ? "success" : "failed";
    }

    /**
     * 测试 @DS + @Transactional 失效
     * 失效的原因：
     * @Transactional 会先初始化事务，里面有连接，因为比较早执行，ThreadLocal 还没设置任何数据源，因此拿默认主数据源；
     * 然后执行到 @DS 的代码，放进数据源名，
     * 后面的 insert 办法会获取连接（Mapper 文件的反射），执行到 org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection(javax.sql.DataSource)
     * 查看里面的逻辑，如果事务已经有连接，不会再调用一次 fetchConnection() 去获取连接，@DS 放进去的数据源自然没有了作用
     */
    @GetMapping("/testDSAdd")
    public int testDSAdd() {
        int success = studentService.testDSAdd();
        return success;
    }
}
